/* Copyright (C) 2015-2016 HangZhou Zenzet Technology Co., Ltd.
 * All right reserved

 * File:crypto/locketstreamcrypt.h
 * Author:guojianchuan/max
 * Date:2016-07-27
 
 */

#ifndef _LOCKET_STREAMCRYPT_H_
#define _LOCKET_STREAMCRYPT_H_

#ifdef __cplusplus
extern "C" {
#endif


/**
* @struct: CIPHER_STREAM_S
* @Author: guojianchuan/max
* @Date: 2016-07-21
* @Description: 流加解密结构体
*/
typedef struct tagStreamCrypt
{
    /* 回调函数 */
    CRYPT_CALLBACK pfCryptCBFunc;
}CIPHER_STREAM_S;

/* 加解密上下文句柄 */
typedef long* CRYPT_HANDLE;

/**
* @Enum:PARSE_STEP_E
* @Author: guojianchuan/max
* @Date: 2016-07-25
* @Description: 解析文件格式的状态机标识
* @caution: 
*/
typedef enum tagParseStep
{
    /* 解析文件头 */
    PARSE_HEADER = 0,

    /* 解析meta长度 */
    PARSE_META_LEN,

    /* 解析meta开头 */
    PARSE_META_START, 

    /* 解析meta结尾 */
    PARSE_META_END, 

    /* 解析thumb开头 */
    PARSE_THUMB_START, 

    /* 解析thumb结尾 */
    PARSE_THUMB_END, 

    /* 解析密文开头 */
    PARSE_DATA_START, 

    /* 解析密文 */
    PARSE_DATA,
    
    /* 解析密文结尾 */
    PARSE_DATA_END, 

    /* 解析完成 */
    PARSE_END
}PARSE_STEP_E;

/* 解密数据块大小 */
#define DECRYPT_BLOCK_SIZE          1024

/* 流加密接口 */
CRYPT_HANDLE LOCKET_CIPHER_StreamEncryptInit(IN CIPHER_STREAM_S *pstStreamCrypt, IN META_S *pstMeta);
int LOCKET_CIPHER_StreamEncryptUpdate (CRYPT_HANDLE hCrypt, char *pcData, int iLen, int iLastBlock);

/* 流解密接口 */
CRYPT_HANDLE LOCKET_CIPHER_StreamDecryptInit(IN CIPHER_STREAM_S *pstStreamCrypt);
int LOCKET_CIPHER_StreamDecryptUpdate (CRYPT_HANDLE hCrypt, char *pcData, int iLen);

/* 资源回收接口,在调用完StreamXXXInit接口之后，必须要调用此接口 */
void LOCKET_CIPHER_StreamCryptFree (CRYPT_HANDLE hCrypt);

#ifdef __cplusplus
}
#endif

#endif  /* _LOCKET_STREAMCRYPT_H_ */
